//
//  AFFRichTextView.h
//  AnyfishApp
//
//  Created by Bob Lee on 14-4-18.
//  Copyright (c) 2014年 Anyfish. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "AFFRichTextBase.h"
#import "AFFRichTextExpression.h"
#import "AFFRichTextURL.h"
#import "AFFRichTextHtml.h"
#import "AFFRichTextNumber.h"

@class AFFRichTextView;

@protocol AFFRichTextViewDelegate<NSObject>

@optional
//- (void)richTextView:(AFFRichTextView *)view touchBeginRun:(AFFRichTextBase *)run;
/**
 * @function
 * 说明 点击特殊文本位置的响应
 * @param view 当前view
 * @param run 特殊文本信息，包括code、原始文本等
 
 * @return
 */
- (void)richTextView:(AFFRichTextView *)view touchEndRun:(AFFRichTextBase *)run;

/**
 * addButton方式的响应，返回btn对应tag
 */
- (void)richTextView:(AFFRichTextView*)view btnTag:(NSInteger)btnTag;

/**
 * 带code的文本
 */
- (void)richTextView:(AFFRichTextView*)view link:(AFFDataPartion*)link;

/**
 * @function
 * 说明 鱼圈专用的回复点击
 * @param view 当前view
 * @param run 特殊文本信息，包括code、原始文本等
 
 * @return
 */
- (void)richTextView:(AFFRichTextView *)view replyTo:(S64)replyToCode;

/**
 * 传入长按的菜单（UIMenuItem对象），注意菜单的SEL不能重复，不能带参数
 */
- (NSArray*)richTextViewLongPressItems;

/**
 * 长按菜单拷贝
 */
- (void)richTextViewLongPressCopy:(AFFRichTextView*)view;

@end

@interface AFFRichTextView : UIView

/********************* 字体、颜色控制 *************************/
/** 文本默认字体，初始化传入因为需要先计算高度*/
@property(nonatomic, strong)            UIFont             *font;
/** 文本默认颜色，如果不设置默认黑色 */
@property(nonatomic, strong)            UIColor            *textColor;
/** 设置超链接颜色 */
@property(nonatomic, strong)            UIColor            *htmlColor;
/** 设置数字、电话号码颜色 */
@property(nonatomic, strong)            UIColor            *numberColor;
/** 设置人名称、鱼名称等具有code的数据颜色 */
@property(nonatomic, strong)            UIColor            *urlColor;
/************************* End *********************/


/*********************** 绘制位置、范围控制 ***********************/
/*内容绘制支持的高度，由用户传入，否则内部计算=heightUsed*/
@property(nonatomic, assign)  CGFloat             heightSupport;
/*内容绘制支持的宽度，由用户传入，否则内部计算=widthUsed*/
@property(nonatomic, assign)  CGFloat             widthSupport;

/*内容绘制使用宽度，相对于给出的最大宽度*/
@property(nonatomic, assign, readonly)  CGFloat             widthUsed;
/*内容绘制使用的高度*/
@property(nonatomic, assign, readonly)  CGFloat             heightUsed;

@property(nonatomic, assign)  CGFloat             heightTarget;  ///< 期望的高度，根据font.lineHeightUsed*期望行数；一般情况请勿使用

@property (nonatomic, assign)           CGRect              rFrame;    ///< 绘制的大小

@property (nonatomic, assign)  CGPoint             original;       ///< 原始绘制起点
/************************ End **********************/

/*********************** 绘制控制信息 ***********************/
/** 是否支持长按 */
@property(nonatomic, assign)            BOOL                handleLongPress; ///< 是否支持长按，默认NO
@property(nonatomic, assign)            BOOL                handleTap;  ///< 是否可点击run，默认YES
/** 是否在touch事件时背景变化 */
@property(nonatomic, assign)            BOOL                responseHit;

@property (nonatomic, assign)           BOOL isAutoPullRefuse;    ///< 禁止自动拉取，默认为NO

/** 长按显示菜单类型 */
@property(nonatomic, assign)            U32 longPressType;
/** 控制收藏绘制  */
@property(nonatomic, assign)            BOOL                hideCollect;
@property (nonatomic, assign)           BOOL                isDrawAsyc;     ///< 是否异步绘制图片，默认NO同步
@property (nonatomic, assign)           NSInteger           numberOfline;   ///< 绘制行数默认为0，代表不限制
/************************ End **********************/



/*********************** 其他保留属性供外界可使用 ***********************/
/** 允许绘制的最大行数，默认1 */
@property(nonatomic, assign)            NSInteger           numberOflineDrawed/*已绘制数量*/;
/** 是否超出了限制的行数 */
@property(nonatomic, assign, readonly)  BOOL                isNeedMorelines;
@property(nonatomic, assign)            NSTextAlignment     textAlignment;
@property(nonatomic, weak)              id<AFFRichTextViewDelegate> delegage;
/************************ End **********************/

@property (nonatomic, assign) BOOL adjustFontToFitOneline;    ///< 只有一行限制时使用，默认NO；注意内容如果没有长度限时，不要使用此属性控制，没法处理目前


/*********************** 其他专用属性 ***********************/
/** 特殊-鱼圈回复 */
@property(nonatomic, assign)            S64                 replyTo;
/** 特殊-鱼圈需要显示的操作信息类型 */
@property(nonatomic, assign)  U32                 circleType;
/** 特殊-鱼圈需要显示的信息这里用于记录显示的related回复、评论，便于操作自己的评论 */
@property(nonatomic, assign)            S64                 relatedMsgCode;
/************************ End **********************/
/** 保持群对象，对于只有1行的需要拉取文本，拉取回来后直接重绘*/
//@property(nonatomic, strong)            AFFDataRoom          *room;
/** 保持原始绘制信息 */
@property(nonatomic, strong)            AFFDataText           *originalMsgText;
@property (nonatomic, strong) NSMutableAttributedString *attributeString;    ///< 绘制的文本


@property (nonatomic, readonly) UIView *tLabView;    ///< 绘制特殊控件的，可控制响应

/**
 * @function
 * 说明 为需要特殊显示部分文字，且需要支持点击操作的
 * @param dataText      配置数据对象，可携带特殊颜色、字体等相关配置
 * @param target        委托对象
 * @param frame         可绘制范围
 */
- (id)initWithAFFDataText:(AFFDataText *)dataText
                   target:(id)target
                    frame:(CGRect)frame;

/**
 * @function
 * 说明 计算特殊配置数据可绘制范围
 * @param dataText       配置数据对象，可携带特殊颜色、字体等相关配置
 * @param widthSupport  可绘制最大宽度
 
 * @return 通过AFFDataText携带回结果数据
 */
+ (void)sizeOfAFFDataText:(AFFDataText *)dataText
             widthSupport:(CGFloat)widthSupport;

/**
 * 普通方法用于计算文本绘制大小
 * @param  text  文本
 * @param  font  字体大小
 * @param  widthSupport  支持宽度
 
 * @return CGSize  大小
 */
+ (CGSize)sizeOfText:(NSString*)text font:(UIFont*)font widthSuport:(CGFloat)widthSupport;

/**
 * 计算富文本view的高度
 * @param  font  字体
 
 * @return 高度
 */
+ (CGFloat)getAttViewHeight:(UIFont*)font;

/**
 * @function
 * 说明 重新绘制特殊配置信息
 * @param dataText 配置数据对象，可携带特殊颜色、字体等相关配置
 
 * @return
 */
- (void)redrawViewWithAFFDataText:(AFFDataText *)dataText;

- (void)dispose;
@end
